#ifndef API_H
#define API_H

#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QUrlQuery>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>
#include <QTimer>
#include <QByteArray>
#include <QString>
#include <QStringConverter>  // 用于UTF-8编码
#include <functional>
#include <QSslConfiguration>  // HTTPS加密配置
#include <QFile>
#include <QMessageBox>
#include <QCache>
#include <QMutex>
#include <QMutexLocker>
#include <QElapsedTimer>

// 定义回调函数类型：参数为（是否成功，响应数据，错误信息）
typedef std::function<void(bool success, const QJsonObject& response, const QString& errorMsg, int StatusCode)> ApiCallback;

class Api : public QObject {
    Q_OBJECT
private:
    static Api* m_instance;  // 静态实例
    QNetworkAccessManager* m_manager;  // 网络请求管理器（全局唯一）
    QString baseUrl = "http://localhost:8080";
    QString m_globalToken;  // 全局身份令牌（如JWT）
    Api();
    ~Api() = default;
    Api(const Api&) = delete;  // 禁止拷贝
    Api& operator=(const Api&) = delete;  // 禁止赋值

    // 通用请求发送函数（内部使用，封装重复逻辑）
    void sendRequest(const QString& url,
                     const QByteArray& method,
                     const QJsonObject& params,
                     int timeoutMs,
                     ApiCallback callback);

    // ==================== 性能优化和错误处理相关 ====================
    
    // 缓存机制
    QCache<QString, QJsonObject> m_dataCache;  // 数据缓存
    QMutex m_cacheMutex;  // 缓存访问互斥锁
    
    // 请求去重和限流
    QSet<QString> m_pendingRequests;  // 正在进行的请求集合
    QMutex m_pendingMutex;  // 请求集合访问互斥锁
    QHash<QString, QList<ApiCallback>> m_requestCallbacks;  // 请求回调队列
    
    // 性能监控
    QElapsedTimer m_performanceTimer;  // 性能计时器
    QHash<QString, qint64> m_requestTimes;  // 请求耗时记录
    
    // 错误处理
    QHash<QString, int> m_retryCount;  // 请求重试计数
    QHash<QString, QJsonObject> m_lastFailedRequests;  // 最后失败的请求
    
    // 私有辅助方法
    QString generateCacheKey(const QString& url, const QJsonObject& params);  // 生成缓存键
    bool isRequestPending(const QString& cacheKey);  // 检查请求是否正在进行
    void addPendingRequest(const QString& cacheKey, ApiCallback callback);  // 添加待处理请求
    void removePendingRequest(const QString& cacheKey);  // 移除待处理请求
    void executePendingCallbacks(const QString& cacheKey, bool success, const QJsonObject& response, const QString& errorMsg, int statusCode);  // 执行待处理回调
    void logPerformanceMetrics(const QString& operation, qint64 elapsedMs);  // 记录性能指标
    bool shouldRetryRequest(const QString& cacheKey, int statusCode);  // 判断是否应该重试请求
    QJsonObject createErrorResponse(const QString& message, const QString& operation = "");  // 创建标准错误响应
    void handleRequestError(const QString& cacheKey, const QString& errorMsg, int statusCode, ApiCallback callback);  // 处理请求错误

public:
    // 设置全局身份令牌（如登录后获取的Token）
    void setGlobalToken(const QString& token) {
        m_globalToken = token;
    }

    static Api* getInstance();

    // HTTP请求方法
    void get(const QString& url, const QJsonObject& params = {}, int timeout = 5000, ApiCallback callback = nullptr);
    void post(const QString& url, const QJsonObject& params = {}, int timeout = 5000, ApiCallback callback = nullptr);
    void del(const QString& url, const QJsonObject& params = {}, int timeout = 5000, ApiCallback callback = nullptr);
    void put(const QString& url, const QJsonObject& params = {}, int timeout = 5000, ApiCallback callback = nullptr);

    // HTTPS配置
    void configureHttps(const QString& caCertPath = "");

    // 数据库相关方法
    bool connectDatabase(const QString& dbName = "ticket_management.db");
    void setupDatabase();
    void insertSampleData();
    void insertSampleOrders();
    
    // 票种管理相关API方法
    void getTickets(const QJsonObject& params, ApiCallback callback);
    void addTicket(const QJsonObject& params, ApiCallback callback);
    void updateTicket(const QJsonObject& params, ApiCallback callback);
    void deleteTicket(const QString& ticketId, ApiCallback callback);
    void searchTicketsWithParams(const QJsonObject& searchParams, ApiCallback callback);
    void deleteTicketWithParams(const QString& ticketId, const QJsonObject& params, ApiCallback callback);
    
    // 订单管理相关API方法
    void getOrders(const QJsonObject& params, ApiCallback callback);
    void updateOrder(const QJsonObject& params, ApiCallback callback);
    void deleteOrder(const QString& orderId, ApiCallback callback);
    void getOrderStatistics(ApiCallback callback);
    
    // 用户管理相关API方法
    void getUsers(const QJsonObject& params, ApiCallback callback);
    QJsonObject getUsers(int page, int pageSize);
    void searchUsers(const QString& searchText, int page, int pageSize, ApiCallback callback);
    QJsonObject getUserStatistics();
    QJsonObject getUserDetails(int userId);
    QJsonObject freezeUser(int userId);
    QJsonObject unfreezeUser(int userId);
    void deleteUser(int userId, ApiCallback callback);
    
    // 仪表板统计相关API方法
    void getDashboardStatistics(ApiCallback callback);
    
    // 数据统计相关API方法
    void getRevenueChartData(const QString& timeRange, ApiCallback callback);
    void getCategoryChartData(const QString& timeRange, ApiCallback callback);
    void getDetailedStatistics(ApiCallback callback);
    QString getPreviousTimeRange(const QString& timeRange);
    
    // 收入统计相关API方法
    void getIncomeStatistics(ApiCallback callback);
    void getRealtimeIncomeData(ApiCallback callback);
    void getDailyIncomeData(const QString& date, ApiCallback callback);
    void getMonthlyIncomeData(const QString& yearMonth, ApiCallback callback);
    void getYearlyIncomeData(const QString& year, ApiCallback callback);
    void getRealtimeIncomeTrend(const QString& timeRange, ApiCallback callback);
    void getSourceAnalysisData(const QString& dimension, const QJsonObject& params, ApiCallback callback);
    
    // 游戏内容管理相关API方法
    void getGameContents(const QJsonObject& params, ApiCallback callback);
    void addGameContent(const QJsonObject& params, ApiCallback callback);
    void updateGameContent(const QJsonObject& params, ApiCallback callback);
    void deleteGameContent(const QString& contentId, ApiCallback callback);
    
    // 公告管理相关API方法
    void getAnnouncements(const QJsonObject& params, ApiCallback callback);
    void addAnnouncement(const QJsonObject& params, ApiCallback callback);
    void updateAnnouncement(const QJsonObject& params, ApiCallback callback);
    void deleteAnnouncement(const QString& announcementId, ApiCallback callback);
    void getAnnouncementDetail(const QString& announcementId, ApiCallback callback);
    
    /**
     * @brief 获取收入趋势分析数据
     * @param startDate 开始日期（格式：YYYY-MM-DD）
     * @param endDate 结束日期（格式：YYYY-MM-DD）
     * @param period 分析周期（日/月/年）
     * @param callback 回调函数
     */
    void getIncomeTrendAnalysisData(const QString& startDate, const QString& endDate, const QString& period, ApiCallback callback);
    
    // 本地数据回退方法
    QJsonObject generateIncomeStatisticsFallback();
    QJsonObject generateSourceAnalysisFallback(const QString& dimension);
    QJsonObject generateTrendAnalysisFallback(const QString& startDate, const QString& endDate, const QString& period);
    
    // ==================== 性能优化和错误处理相关公共方法 ====================
    
    /**
     * @brief 带缓存和错误处理的增强版GET请求
     * @param url 请求URL
     * @param params 请求参数
     * @param timeoutMs 超时时间（毫秒）
     * @param callback 回调函数
     * @param useCache 是否使用缓存（默认true）
     * @param cacheTimeoutMs 缓存超时时间（毫秒，默认30000）
     */
    void getCached(const QString& url, const QJsonObject& params, int timeoutMs, ApiCallback callback, bool useCache = true, int cacheTimeoutMs = 30000);
    
    /**
     * @brief 清理缓存
     * @param pattern 缓存键模式（为空时清理所有缓存）
     */
    void clearCache(const QString& pattern = "");
    
    /**
     * @brief 获取性能统计信息
     * @return 性能统计信息
     */
    QJsonObject getPerformanceStats();
};

#endif // API_H
